#ifndef OBJECTDETECTPOSTPROCESS_ODP_H
#define OBJECTDETECTPOSTPROCESS_ODP_H

#include <opencv2/opencv.hpp>
#include <cstddef>

namespace odp {

    class ODP {
    public:
        /*!
         * 参数设置
         * @param score_threshold  置信度阈值设置
         * @param iou_threshold   iou阈值设置
         */
        void SetParameter(float score_threshold, float iou_threshold);

        /*!
         * 处理yolov3输出的结果，进行box筛选
         * @param data_ptr 一维矩阵数据指针
         * @param data_len 数据总长度
         * @param class_number 类别数目
         */
        bool Process_Array(float * data_ptr, size_t data_len, int class_number);

        /*!
         * 处理yolov3输出的结果，进行box筛选
         * @param data_mat 输入矩阵，例如 [16128, 25]
         */
        bool Process_Mat(cv::Mat &data_mat);


        /*!
         * 获取处理结果
         * @return 处理过后的box矩阵
         */
        cv::Mat &GetResult();

    private:
        std::set<int> filters_set(cv::Mat m);

        void nms_functions(cv::Mat & input_mat, cv::Mat &result_mat);
        float box_iou(cv::Mat box1, cv::Mat box2);

    private:
        float score_threshold{0.5};
        float iou_threshold{0.7};
        cv::Mat result_mat;
    };

}
#endif //OBJECTDETECTPOSTPROCESS_ODP_H
